package com.bt7274.service;

import com.bt7274.pojo.bo.*;
import com.bt7274.pojo.vo.*;
import com.bt7274.utils.PageResponse;
import java.time.LocalDateTime;
import java.util.List;
/**
 * @BelongsProject: bt7274-back
 * @BelongsPackage: com.bt7274.service
 * @Author: Galland
 * @CreateTime: 2025-06-14
 * @Description: 用户考核服务接口
 * @Version: 1.0
 */
public interface AssessmentService {

    // ========== 规则管理 ==========

    /**
     * 创建考核规则
     * @param ruleBO 规则信息
     * @return 规则ID
     */
    Integer createAssessmentRule(CreateUserRuleBO ruleBO);

    /**
     * 更新考核规则
     * @param ruleBO 更新信息
     */
    void updateAssessmentRule(UpdateUserRuleBO ruleBO);

    /**
     * 删除考核规则
     * @param ruleId 规则ID
     */
    void deleteAssessmentRule(Integer ruleId);

    /**
     * 启用/禁用考核规则
     * @param ruleId 规则ID
     * @param isActive 是否启用
     */
    void toggleRuleStatus(Integer ruleId, Integer isActive);

    /**
     * 获取考核规则列表
     * @param current 当前页
     * @param size 页大小
     * @param isActive 是否启用（可选）
     * @return 规则列表
     */
    PageResponse<UserRuleVO> getAssessmentRules(Integer current, Integer size, Integer isActive);

    /**
     * 获取规则详情
     * @param ruleId 规则ID
     * @return 规则详情
     */
    UserRuleVO getRuleDetail(Integer ruleId);

    // ========== 考核执行 ==========

    /**
     * 执行自动考核（定时任务调用）
     * @return 批量考核结果
     */
    BatchAssessmentResultVO executeAutoAssessment();

    /**
     * 手动执行考核
     * @param assessmentBO 考核参数
     * @return 考核结果
     */
    BatchAssessmentResultVO executeManualAssessment(ManualAssessmentBO assessmentBO);

    /**
     * 考核单个用户
     * @param userId 用户ID
     * @param ruleId 规则ID（可选，为空则执行所有规则）
     * @return 考核结果列表
     */
    List<AssessmentResultVO> assessUser(String userId, Integer ruleId);

    // ========== 考核查询 ==========

    /**
     * 获取用户考核状态
     * @param userId 用户ID
     * @return 考核状态
     */
    UserAssessmentStatusVO getUserAssessmentStatus(String userId);

    /**
     * 获取用户考核历史
     * @param userId 用户ID
     * @param current 当前页
     * @param size 页大小
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 考核历史
     */
    PageResponse<AssessmentResultVO> getUserAssessmentHistory(
            String userId, Integer current, Integer size,
            LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取考核统计
     * @param ruleId 规则ID（可选）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计结果
     */
    List<AssessmentStatisticsVO> getAssessmentStatistics(
            Integer ruleId, LocalDateTime startTime, LocalDateTime endTime);

    // ========== 惩罚管理 ==========

    /**
     * 执行考核惩罚
     * @param userId 用户ID
     * @param penalty 惩罚类型
     * @param reason 原因
     * @return 是否成功
     */
    boolean applyPenalty(String userId, String penalty, String reason);

    /**
     * 撤销考核惩罚
     * @param userId 用户ID
     * @param penalty 惩罚类型
     * @param reason 原因
     * @return 是否成功
     */
    boolean revokePenalty(String userId, String penalty, String reason);

    /**
     * 获取用户当前惩罚
     * @param userId 用户ID
     * @return 惩罚列表
     */
    List<String> getUserActivePenalties(String userId);

    // ========== 辅助功能 ==========

    /**
     * 计算用户指标值
     * @param userId 用户ID
     * @param metric 指标类型
     * @return 指标值
     */
    Float calculateUserMetric(String userId, String metric);

    /**
     * 检查用户是否豁免
     * @param userId 用户ID
     * @param ruleId 规则ID
     * @return 是否豁免
     */
    boolean isUserExempted(String userId, Integer ruleId);

    /**
     * 获取需要考核的用户列表
     * @param ruleId 规则ID
     * @return 用户ID列表
     */
    List<String> getUsersForAssessment(Integer ruleId);

    /**
     * 发送考核通知
     * @param userId 用户ID
     * @param result 考核结果
     */
    void sendAssessmentNotification(String userId, AssessmentResultVO result);
}
